package com.algorithm.dichotomy;

/**
 *  旋转数组的最小数字
 *  题目：把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。
 * 输入一个非递减排序的数组的一个旋转，输出旋转数组的最小元素。
 * NOTE：给出的所有元素都大于0，若数组大小为0，请返回0。
 *注意：题目中说得是非递减排序数组，并不一定是递增排序也可以有重复的值。
 *思路1（循环对比）：仔细分析题目可知，移动到末尾的几个数字一定是按照非递减排序的，所以移动到后面的几个数字中最前面的肯定是最小的
 * 按顺序循环移动后的数组，若果第一位如果第一次不小于数组中的一位数（i）那么这个数（i）一定就是最小的。
 * 思路2（二分法）：使用二分法取得中间数值，如果中间数值小于头结点，那么最小的数在前半部分，否则在后半部分，依次使用二分法
 * 如果中间数值等于尾结点就不确定是最小值在哪一册只能一个一个试。
 */
public class MinNumberInRotateArray {
    public static void main(String[] args) {

    }
    public int minNumberInRotateArray(int [] array) {
        if(array.length==0){
            return 0;
        }
        int low=0;
        int high=array.length-1;
        while(low <= high){
            int mid=(low+high)/2;
            if (array[mid]>array[high]){
                low=mid+1;
            }else if (array[mid]==array[high]){
                high = high - 1;
            }else {
//                high=mid-1;
                //使用high=mid的原因试防止重甲这个位置是最小的数，就会跳过，例如[2,1,2]
                high=mid;
            }
        }
        return array[low];


    }
    public int minNumberInRotateArray1(int [] array) {
        if(array.length==0){
            return 0;
        }
        for(int i=0;i<array.length-1;i++){
            if(array[0]>array[i]){
                return array[i];
            }
        }
        return array[0];
    }

}
